package de.dis2011.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import de.dis2011.data.DB2ConnectionManager;

public class Immobilie
{
    protected int id = -1;
    private String ort;
    private String plz;
    private String strasze;
    private int hausnr;
    private int flaeche;
    private int verwalter;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getOrt()
    {
        return ort;
    }

    public void setOrt(String ort)
    {
        this.ort = ort;
    }

    public String getPlz()
    {
        return plz;
    }

    public void setPlz(String plz)
    {
        this.plz = plz;
    }

    public String getStrasze()
    {
        return strasze;
    }

    public void setStrasze(String strasze)
    {
        this.strasze = strasze;
    }

    public int getHausnr()
    {
        return hausnr;
    }

    public void setHausnr(int hausnr)
    {
        this.hausnr = hausnr;
    }

    public int getFlaeche()
    {
        return flaeche;
    }

    public void setFlaeche(int flaeche)
    {
        this.flaeche = flaeche;
    }

    public int getVerwalter()
    {
        return verwalter;
    }

    public void setVerwalter(int verwalter)
    {
        this.verwalter = verwalter;
    }

    /**
     * Lädt einen Immobilie aus der Datenbank
     * 
     * @param id
     *            ID der zu ladenden Immobilie
     * @return Immobilie-Instanz
     */
    public static Immobilie load(int id)
    {
        try
        {
            // Hole Verbindung
            Connection con = DB2ConnectionManager.getInstance().getConnection();

            // Erzeuge Anfrage
            String selectSQL = "SELECT * FROM immobilie WHERE id = ?";
            PreparedStatement pstmt = con.prepareStatement(selectSQL);
            pstmt.setInt(1, id);

            // Führe Anfrage aus
            ResultSet rs = pstmt.executeQuery();
            if (rs.next())
            {
                Immobilie ts = new Immobilie();
                ts.setId(id);
                ts.setOrt(rs.getString("ort"));
                ts.setPlz(rs.getString("plz"));
                ts.setStrasze(rs.getString("strasze"));
                ts.setHausnr(rs.getInt("hausnr"));
                ts.setFlaeche(rs.getInt("flaeche"));
                ts.setVerwalter(rs.getInt("verwalter"));
                rs.close();
                pstmt.close();
                return ts;
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Speichert den Immobilie in der Datenbank. Ist noch keine ID vergeben worden,
     * wird die generierte Id von DB2 geholt und dem Model übergeben.
     */
    public void save()
    {
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Füge neues Element hinzu, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                // Achtung, hier wird noch ein Parameter mitgegeben,
                // damit spC$ter generierte IDs zurC<ckgeliefert werden!
                String insertSQL = "INSERT INTO immobilie(ort, plz, strasze, hausnr, flaeche, verwalter) VALUES (?, ?, ?, ?, ?, ?)";

                PreparedStatement pstmt = con.prepareStatement(insertSQL, Statement.RETURN_GENERATED_KEYS);

                // Setze Anfrageparameter und führe Anfrage aus
                pstmt.setString(1, getOrt());
                pstmt.setString(2, getPlz());
                pstmt.setString(3, getStrasze());
                pstmt.setInt(4, getHausnr());
                pstmt.setInt(5, getFlaeche());
                pstmt.setInt(6, getVerwalter());
                pstmt.executeUpdate();

                // Hole die Id des engefügten Datensatzes
                ResultSet rs = pstmt.getGeneratedKeys();
                if (rs.next())
                {
                    setId(rs.getInt(1));
                }

                rs.close();
                pstmt.close();
            }
            else
            {
                // Falls schon eine ID vorhanden ist, mache ein Update...
                String updateSQL = "UPDATE immobilie SET ort = ?, plz = ?, strasze = ?, hausnr = ?, flaeche = ?, verwalter = ? WHERE id = ?";
                PreparedStatement pstmt = con.prepareStatement(updateSQL);

                // Setze Anfrage Parameter
                pstmt.setString(1, getOrt());
                pstmt.setString(2, getPlz());
                pstmt.setString(3, getStrasze());
                pstmt.setInt(4, getHausnr());
                pstmt.setInt(5, getFlaeche());
                pstmt.setInt(6, getVerwalter());
                pstmt.setInt(7, getId());
                pstmt.executeUpdate();

                pstmt.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void delete()
    {
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Lösche Element, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                System.out.println("Was nicht vorhanden ist, kann nicht gelöscht werden");
            }
            else
            {
                String deleteSQL = "DELETE FROM immobilie WHERE id = ?";
                PreparedStatement pstmt = con.prepareStatement(deleteSQL);

                // Setze Anfrage Parameter
                pstmt.setInt(1, getId());
                pstmt.executeUpdate();

                pstmt.close();

            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void edit()
    {
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Lösche Element, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                System.out.println("Was nicht vorhanden ist, kann nicht geändert werden");
            }
            else
            {
                // Falls schon eine ID vorhanden ist, mache ein Update...
                String updateSQL = "UPDATE immobilie SET ort = ?, plz = ?, strasze = ?, hausnr = ?, flaeche = ?, verwalter = ? WHERE id = ?";
                PreparedStatement pstmt = con.prepareStatement(updateSQL);

                // Setze Anfrage Parameter
                pstmt.setString(1, getOrt());
                pstmt.setString(2, getPlz());
                pstmt.setString(3, getStrasze());
                pstmt.setInt(4, getHausnr());
                pstmt.setInt(5, getFlaeche());
                pstmt.setInt(6, getVerwalter());
                pstmt.setInt(7, getId());
                pstmt.executeUpdate();

                pstmt.close();

            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
}
